/*
  视觉与电控通信协议
*/

#pragma once

#include <stdint.h>

#define BOARD_C

#ifdef WHEEL_TEC

#define RECV_DATA_SIZE 24   // 下位机发送过来的数据的长度
#define TRANS_DATA_SIZE 11  // 向下位机发送的数据的长度

#ifdef __cplusplus
extern "C" {
#endif

/* 电控 -> 视觉 数据结构体*/
typedef struct __attribute__((packed)) {
  float vx;
  float vy;
  float vz;
  float ax;
  float ay;
  float az;
  float wx;
  float wy;
  float wz;
  float power_voltage;
} Protocol_UpData_t;

/* 视觉 -> 电控 数据结构体*/
typedef struct __attribute__((packed)) {
  float vx; /* x轴移动速度 */
  float vy; /* y轴移动速度 */
  float wz; /* z轴转动速度 */
} Protocol_DownData_t;

typedef struct __attribute__((packed)) {
  uint8_t rx[RECV_DATA_SIZE];
  uint8_t stop_flag;
  unsigned char frame_header;
  Protocol_UpData_t data;
  unsigned char frame_tail;
} Protocol_UpPackage_t;

typedef struct __attribute__((packed)) {
  uint8_t tx[TRANS_DATA_SIZE];
  Protocol_DownData_t data;
  unsigned char frame_tail;
} Protocol_DownPackage_t;

#ifdef __cplusplus
}
#endif

#else

#ifdef __cplusplus
extern "C" {
#endif

/* 电控 -> 视觉 MCU数据结构体*/
typedef struct __attribute__((packed)) {
  struct __attribute__((packed)) {
    struct __attribute__((packed)) {
      float wx;
      float wy;
      float wz;
    } gyro;
    struct __attribute__((packed)) {
      float ax;
      float ay;
      float az;
    } accl;
    struct __attribute__((packed)) {
      float pit;
      float rol;
      float yaw;
    } ahrs;
  } imu;
  struct __attribute__((packed)) {
    float m1;
    float m2;
    float m3;
    float m4;
  } motors;
} Protocol_UpData_t;

/* 视觉 -> 电控 数据结构体*/
typedef struct __attribute__((packed)) {
  float vx; /* x轴移动速度 */
  float vy; /* y轴移动速度 */
  float wz; /* z轴转动速度(弧度0～pi) */
} Protocol_DownData_t;

typedef struct __attribute__((packed)) {
  Protocol_UpData_t data;
  uint16_t crc16;
} Protocol_UpPackage_t;

typedef struct __attribute__((packed)) {
  Protocol_DownData_t data;
  uint16_t crc16;
} Protocol_DownPackage_t;

#ifdef __cplusplus
}
#endif

#endif

class Protocal_Andr {
  float x;
  float y;
  float z;
  Protocal_Andr() : x(0), y(0), z(0) {}
  Protocal_Andr(float a, float b, float c) : x(a), y(b), z(c) {}
};